package com.qf.controller;

import org.apache.curator.framework.recipes.locks.InterProcessMutex;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * 使用Redis实现分布式锁
 * @author lixu
 */
@RestController
@RequestMapping("/redis")
public class RedisController {
    //商品库存  减库存
    private static Map<String, Integer> itemStock = new HashMap<>();
    //商品订单  加订单
    private static Map<String, Integer> itemOrder = new HashMap<>();
    //.class 被类加载器所加载的时候 就会执行 静态代码块
    static {
        itemStock.put("牙刷", 10000);//"牙刷" 10000件
        itemOrder.put("牙刷", 0);//"牙刷",初始化没有订单
    }

    @Autowired
    private RedisTemplate redisTemplate; //Redis客户端

    /**
     * 秒杀
     *
     *   setnx : 分布式锁的命令
     *      1、setnx key value : 如果 key存在了 就表示此Key已经加锁了  不能再设置锁了
     *                           如果 Key不存在  就表示此Key未加锁   可以进行设置
     *
     *
     */
    @GetMapping("/kill")
    public String kill(String item) throws Exception {

        String key = "lock"; // Redis的Key

        //如果返回值  false: 已经被别人加锁了 不能再设置了   true:别人未加锁  可以设置
        Boolean isLock = redisTemplate.opsForValue().setIfAbsent(key, "123",10,TimeUnit.SECONDS);
        //如果是true  获取到了锁
        if (isLock) {
            //判断当前是否还有剩余的商品库存
            Integer stock = itemStock.get(item);
            if (stock <= 0) {
                return item + ":没有货了";
            }
            Thread.sleep(100);
            //有货  减库存
            stock--;
            itemStock.put(item, stock);
            /////////////////////////////////////////////////////////
            Thread.sleep(200);
            //加订单
            Integer num = itemOrder.get(item);
            num++;
            itemOrder.put(item, num);
            //释放锁  就是删除Key
            redisTemplate.delete(key);
        } else {
            //重新走方法
            kill(item);//500
        }
        return "抢购成功！！！" + item + "： 剩余库存数为 - "
                + itemStock.get(item) + "，订单数为 - " + itemOrder.get(item);

    }
}
